/*
 * IdPlaneta.h
 *
 *  Created on: 07/01/2010
 *      Author: San Martín, Matías I.
 */

#ifndef IDPLANETA_H_
#define IDPLANETA_H_

#include <string>
#include <sstream>
#include <iostream>

//TODO CAMBIAR DE LUGAR ESTO, EL MIDDLEWARE NO PUEDE DEPENDER DE LA APLICACION
#include "../../Aplicacion/Common/Mensajes/MensajesCommonTypes.h"

#include "CommonTypes.h"
#include "IdUniverso.h"


/**
 * Represeenta un identificador de planeta dentro del sistema (local a un universo)
 */
class IdPlaneta {

//------------------------------ CONSTANTES ------------------------------
public:
	static const T_ID_PLANETA ID_UNDEFINED = -1;
//------------------------------ ATRIBUTOS ------------------------------
private:
	T_ID_PLANETA _id;
	IdUniverso _idContainer;

//------------------------------ METODOS ------------------------------
public:

	IdPlaneta() :
		_id(ID_UNDEFINED) {
	}

	IdPlaneta(T_ID_PLANETA id) :
		_id(id) {
	}

	IdPlaneta(T_ID_PLANETA id, IdUniverso idContenedor) :
			_id(id), _idContainer(idContenedor)
	{
	}

	virtual ~IdPlaneta(){}

	void setId(T_ID_PLANETA id) {
		_id = id;
	}

	void setContainerId(const IdUniverso& id) {
		_idContainer = id;
	}

	bool isDefined() {
		return _id != ID_UNDEFINED;
	}

	/**
	 * Devuelve una cadena que identifica al planeta univocamente en el
	 * juego y no contiene caracteres especiales (solo alfanumericos y _)
	 */
	std::string getUid() const
	{
		std::stringstream stm;
		stm << _idContainer.getUid() << "_" << _id;
		return stm.str();
	}

	T_ID_PLANETA getId() const { return _id; }

	T_ID_UNIVERSO getIdUniverso() const { return _idContainer.getId(); }

	std::string toString() const
	{
		std::stringstream stm;
		stm << *this;
		return stm.str();
	}

	bool operator == (const IdPlaneta& otro) const
	{
		return _idContainer == otro._idContainer && _id == otro._id;
	}

	bool operator != (const IdPlaneta& otro) const
	{
		return !(otro == *this);
	}

	bool operator < (const IdPlaneta& otro) const
	{
		return _idContainer < otro._idContainer ||
				(_idContainer == otro._idContainer && _id < otro._id);
	}

	bool operator > (const IdPlaneta& otro) const
	{
		return otro < *this;
	}



	void saveToMensaje (aplicacion::t_identificadorFuente& id) const
	{
		_idContainer.saveToMensaje(id);
		id.contenido = _id;
	}

	void loadFromMensaje (const aplicacion::t_identificadorFuente& id)
	{
		_idContainer.loadFromMensaje(id);
		_id = id.contenido;
	}

private:
	friend std::ostream &operator<<( std::ostream &stream, const IdPlaneta &obj );
};

#endif /* IDPLANETA_H_ */
